home *** CD-ROM | disk | FTP | other *** search
/ .net 2002 March / DotNetMagazine-Issue107-Coverdisc-NET107-02-03-PCMac.bin / pc / PC Software / free_browsing / DavesQckSearchDbar3-14 / dqsd.exe / src / DQSDTools / Utilities.cpp < prev    next >
C/C++ Source or Header  |  2002-07-18  |  5KB  |  245 lines

  1.  
  2.  
  3.  
  4. #include "StdAfx.h"
  5. #include <comdef.h>
  6.  
  7. #include "Utilities.h"
  8.  
  9. HWND g_hDQSDWindow;
  10.  
  11.  
  12.  
  13. INTERNET_SCHEME GetScheme(LPCTSTR szURL)
  14. {
  15.   TCHAR             buf[32];
  16.   URL_COMPONENTS    uc;
  17.   ZeroMemory(&uc, sizeof uc);
  18.  
  19.   uc.dwStructSize = sizeof uc;
  20.   uc.lpszScheme = buf;
  21.   uc.dwSchemeLength = sizeof buf;
  22.  
  23.   if (InternetCrackUrl(szURL, lstrlen(szURL), ICU_DECODE, &uc))
  24.      return uc.nScheme;
  25.   else
  26.      return INTERNET_SCHEME_UNKNOWN;
  27. }
  28.  
  29. int URLMatchesFilename(LPCTSTR szURL, LPCTSTR szFile)
  30. {
  31.   TCHAR             pathbuf[_MAX_PATH];
  32.   URL_COMPONENTS    uc;
  33.   ZeroMemory(&uc, sizeof uc);
  34.  
  35.   uc.dwStructSize = sizeof uc;
  36.   uc.lpszUrlPath = pathbuf;
  37.   uc.dwUrlPathLength = sizeof pathbuf;
  38.   if (!InternetCrackUrl(szURL, lstrlen(szURL), ICU_DECODE, &uc))
  39.      return FALSE;
  40.  
  41.   if (uc.nScheme != INTERNET_SCHEME_FILE)
  42.     return FALSE;
  43.  
  44.   if (StrCmpI(uc.lpszUrlPath, szFile))
  45.     return FALSE;
  46.  
  47.   return TRUE;
  48. }
  49.  
  50.  
  51. BOOL CALLBACK EnumChildProc(
  52.   HWND hwnd,      // handle to child window
  53.   LPARAM lParam   // application-defined value
  54. )
  55. {
  56.     TCHAR className[201];
  57.  
  58.     UNREFERENCED_PARAMETER(lParam);
  59.  
  60.     GetClassName(hwnd, className, 200);
  61.     if(StrCmpI(className, "OCHost") == 0)
  62.     {
  63.         // We've found a likely looking window 
  64.         std::string classList, thisClassName;
  65.         HWND hWorkingWnd = hwnd;
  66.         HWND hNextWindow;
  67.  
  68.         // Go to the bottom of the hierachy
  69.         while((hNextWindow = GetWindow(hWorkingWnd, GW_CHILD)) != NULL)
  70.         {
  71.             hWorkingWnd = hNextWindow;
  72.         }
  73.  
  74.         // Work back up
  75.         do
  76.         {
  77.             GetClassName(hWorkingWnd, className, 200);
  78. //            ATLTRACE("ClassName: %s\n", className);
  79.             thisClassName = className;
  80.             thisClassName += ", ";
  81.             classList.insert(0, thisClassName);
  82.         }
  83.         while((hWorkingWnd = GetParent(hWorkingWnd)) != NULL);
  84.  
  85.         ATLTRACE("ClassList: %s\n", classList.c_str());
  86.         MessageBox(NULL, classList.c_str(), "DQSD Window Path", MB_OK | MB_ICONINFORMATION);
  87.     }
  88.     return TRUE;
  89. }
  90.  
  91.  
  92. BOOL CALLBACK TopLevelEnumCallback(
  93.   HWND hwnd,      
  94.   LPARAM lParam   
  95. )
  96. {
  97.     UNREFERENCED_PARAMETER(lParam);
  98.  
  99.     EnumChildWindows(hwnd, EnumChildProc, NULL);
  100.     return TRUE;
  101. }
  102.  
  103.  
  104. static void
  105. WindowWalker()
  106. {
  107.     EnumWindows(TopLevelEnumCallback, NULL);
  108. }
  109.  
  110. //
  111. // Find the DQSD window (usually, but not always, on the taskbar)
  112. //
  113. // Return:
  114. //        The window handle, or null if we fail
  115. HWND
  116. UtilitiesFindDQSDWindow(LPDISPATCH pDispDocument)
  117. {
  118.     IOleWindowPtr pOleWindow;
  119.  
  120.     try
  121.     {
  122.         HRESULT hResult = pDispDocument->QueryInterface(IID_IOleWindow, (LPVOID*)&pOleWindow);
  123.         if(SUCCEEDED(hResult))
  124.         {
  125.             HWND hWnd;
  126.  
  127.             hResult = pOleWindow->GetWindow(&hWnd);
  128.             ATLTRACE("UtilitiesFindDQSDWindow: hResult 0x%x, hWnd 0x%x\n", hResult, hWnd);
  129.             if(SUCCEEDED(hResult))
  130.             {
  131.                 g_hDQSDWindow = hWnd;
  132.                 return hWnd;
  133.             }
  134.         }
  135.         else
  136.         {
  137.             ATLTRACE("UtilitiesFindDQSDWindow: GetSiteFailed hResult 0x%x\n", hResult);
  138.         }
  139.  
  140.     }
  141.     catch(_com_error& e)
  142.     {
  143.         ATLTRACE("UtilitiesFindDQSDWindow: COM exception: Desc %s, Message %d\n", 
  144.             (LPCTSTR)e.Description(), 
  145.             (LPCTSTR)e.ErrorMessage());
  146.     }
  147.     catch(...)
  148.     {
  149.         ATLTRACE("UtilitiesFindDQSDWindow: Unknown Exception Caught\n");
  150.     }
  151.     return NULL;
  152. }
  153.  
  154.  
  155.  
  156.  
  157. //
  158. // Find the DQSD window (usually, but not always, on the taskbar)
  159. //
  160. // Return:
  161. //        The window handle, or null if we fail
  162. HWND
  163. UtilitiesFindDQSDWindow(bool bCheckForNonTaskbar)
  164. {
  165.     // The following window hierarchy was determined using Spy++ on Windows XP Pro Build 2600.
  166.     // Should be the same at least on Windows 2000 and other Win XP versions.
  167.     static LPCTSTR rgszClassNames[][10] = 
  168.     {
  169.         { 
  170.             // This is a normal taskbar window
  171.             _T("Shell_TrayWnd"), 
  172.             _T("ReBarWindow32"), 
  173.             _T("OCHost"), 
  174.             _T("Shell Embedding"), 
  175.             _T("Shell DocObject View"), 
  176.             _T("Internet Explorer_Server"),
  177.             NULL
  178.         },
  179.         // This is if you dock DQSD on it's own to a desktop edge
  180.         { 
  181.             _T("BaseBar"), 
  182.             _T("ReBarWindow32"), 
  183.             _T("OCHost"), 
  184.             _T("Shell Embedding"), 
  185.             _T("Shell DocObject View"), 
  186.             _T("Internet Explorer_Server"),
  187.             NULL
  188.         },
  189.         { 
  190.             // I think this finds more than just the DQSD window, so where that matters, it's disabled by the bCheckForNonTaskbar parameter
  191.             _T("IEFrame"), 
  192.             _T("Shell DocObject View"), 
  193.             _T("Internet Explorer_Server"),
  194.             NULL,
  195.         },
  196.  
  197.     };
  198.  
  199.     int maxTrees = bCheckForNonTaskbar ? 3 : 2;
  200.  
  201.     //We now traverse the array of window classes. 
  202.     // The first window class is OCHost
  203.     HWND hwndDQSD = NULL;
  204.  
  205.     // Make up to three passes with a delay here
  206.     for(int nAttempt = 0; hwndDQSD == NULL && nAttempt < 3; nAttempt++)
  207.     {
  208.         for(int nTree = 0; hwndDQSD == NULL && nTree < maxTrees; nTree++)
  209.         {
  210.             for ( int i = 0; i < sizeof(rgszClassNames[0])/sizeof(rgszClassNames[0][0]); i++ ) 
  211.             {
  212.                 LPCTSTR pClassName = rgszClassNames[nTree][i];
  213.  
  214.                 if(pClassName == NULL)
  215.                 {
  216.                     // We've reached the end of a list - we must have found the window
  217.                     break;
  218.                 }
  219.  
  220.                 hwndDQSD = ::FindWindowEx( hwndDQSD, NULL, pClassName, NULL );
  221.  
  222.                 if ( NULL == hwndDQSD )
  223.                 {
  224.                     // We've failed to find the window using this attempt - break out of the 
  225.                     // inner traversal loop and attempt another class name list
  226.                     break;
  227.                 }
  228.             }
  229.         } 
  230.  
  231.         if(hwndDQSD == NULL)
  232.         {
  233.             Sleep(300);
  234.         }
  235.     }
  236.  
  237.     if(hwndDQSD == NULL)
  238.     {
  239.         WindowWalker();
  240.     }
  241.  
  242.     ATLTRACE("UtilitiesFindDQSDWindow: Returning 0x%x\n", hwndDQSD);
  243.  
  244.     return hwndDQSD;
  245. }